/*
 * @lc app=leetcode.cn id=42 lang=java
 *
 * [42] 接雨水
 *
 * https://leetcode-cn.com/problems/trapping-rain-water/description/
 *
 * algorithms
 * Hard (47.55%)
 * Likes:    749
 * Dislikes: 0
 * Total Accepted:    43.3K
 * Total Submissions: 90.9K
 * Testcase Example:  '[0,1,0,2,1,0,1,3,2,1,2,1]'
 *
 * 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
 *
 *
 *
 * 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。 感谢
 * Marcos 贡献此图。
 *
 * 示例:
 *
 * 输入: [0,1,0,2,1,0,1,3,2,1,2,1]
 * 输出: 6
 *
 */

// @lc code=start
class Solution {
    public int trap(int[] height) {
        int maxHeight = 0, index = -1;
        for(int i=0; i < height.length; i++) {
            if(height[i] > maxHeight) {
                maxHeight =  height[i];
                index = i;
            }
        }
        int sum = 0, lMax = -1, rMax = -1;
        for(int i=0; i<index; i++) {
            lMax = height[i] > lMax ? height[i] : lMax;
            sum += lMax > maxHeight ? maxHeight - height[i] : lMax - height[i];
        }
        for(int i=height.length - 1; i>index; i--) {
            rMax = height[i] > rMax ? height[i] : rMax;
            sum += rMax > maxHeight ? maxHeight - height[i] : rMax - height[i];
        }
        return sum;
    }
}
// @lc code=end

